package com.xiaoming.backend.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class DecimalUtils {
    
    /** 默认精度（保留两位小数） */
    private static final int DEFAULT_SCALE = 2;
    /** 默认舍入模式（四舍五入） */
    private static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_UP;

    //-------------------------- 基础运算 --------------------------
    /** 加法运算 */
    public static BigDecimal add(BigDecimal a, BigDecimal b) {
        return a.add(b);
    }

    /** 减法运算 */
    public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
        return a.subtract(b);
    }

    /** 乘法运算 */
    public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
        return a.multiply(b);
    }

    /** 除法运算（默认精度和舍入模式） */
    public static BigDecimal divide(BigDecimal a, BigDecimal b) {
        return a.divide(b, DEFAULT_SCALE, DEFAULT_ROUNDING);
    }

    /** 自定义精度的除法运算 */
    public static BigDecimal divide(BigDecimal a, BigDecimal b, int scale, RoundingMode mode) {
        return a.divide(b, scale, mode);
    }

    //-------------------------- 比较运算 --------------------------
    /** 大于判断 */
    public static boolean isGreater(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) > 0;
    }

    /** 小于判断 */
    public static boolean isLess(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) < 0;
    }

    /** 等于判断（数值相等，不考虑精度） */
    public static boolean equalsIgnoreScale(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) == 0;
    }

    //-------------------------- 字符串转换 --------------------------
    /** 字符串转BigDecimal（自动清理千位分隔符） */
    public static BigDecimal fromString(String str) {
        return new BigDecimal(str.replaceAll(",", ""));
    }

    /** 安全转换（失败返回默认值） */
    public static BigDecimal safeFromString(String str, BigDecimal defaultValue) {
        try {
            return new BigDecimal(str.replaceAll("[^\\d.]", ""));
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /** 格式化金额（带千位分隔符，保留两位小数） */
    public static String formatCurrency(BigDecimal num) {
        DecimalFormat df = new DecimalFormat("#,##0.00");
        return df.format(num);
    }

    /** 保留指定位数的小数 */
    public static String toString(BigDecimal num, int scale) {
        return num.setScale(scale, DEFAULT_ROUNDING).toString();
    }

    //-------------------------- 示例用法 --------------------------
    public static void main(String[] args) {
        BigDecimal a = fromString("12,345.67");
        BigDecimal b = safeFromString("invalid", BigDecimal.ZERO);

        System.out.println("相加: " + add(a, b)); // 12,345.67 + 0 = 12,345.67
        System.out.println("相除: " + divide(a, new BigDecimal("100"))); // 123.46
        System.out.println("格式化: " + formatCurrency(a)); // 12,345.67
        System.out.println("比较结果: " + isGreater(a, b)); // true
    }
}
